import os
import string
import random
from io import BytesIO
from PIL import Image,ImageDraw,ImageFont
from django.conf import settings
from django.forms.widgets import PasswordInput  # 项目中的settings文件，配置了BASEDIR路径，在这里无需关注
from django.shortcuts import render,redirect

# 引入模型
from .models import UserProfile
from django.contrib.auth.models import User
from . import forms as formAuth
# Create your views here.

# 注册视图类
def register(request):
    """注册"""
    if request.method == 'GET':
        # 注册页面的生成我们并没有用form，因为我们使用的别人的模板样式
        return render(request, "register/register.html")

    elif request.method == 'POST':
        # post请求提交注册数据
        data = request.POST
        form_obj = formAuth.RegForm(data)  # 数据交给form实例化
        if form_obj.is_valid():  # 验证提交数据的合法性
            valid_data = form_obj.cleaned_data
            username = valid_data.get("username")
            # 判断帐号是否已存在
            if User.objects.filter(username=username):
                # 如果存在，给form中的username字段添加一个错误提示。
                form_obj.add_error("username", "帐号已存在")
                return render(request, "register/register.html", {"form_obj": form_obj})
            else:
                # 帐号可用，去掉多余密码，在数据库创建记录
                del valid_data["r_password"]
                
                # 创建普通用户
                user = User.objects.create_user(
                    username = valid_data.get("username"),
                    first_name = valid_data.get("first_name"),
                    last_name = valid_data.get("last_name"),
                    password = valid_data.get('password'),
                    email = valid_data.get("email"),

                )

                user_profile = UserProfile(
                    user = user,
                    student_id = valid_data.get("student_id"),
                    phone = valid_data.get("phone"),
                    # true_name = valid_data.get("true_name")
                )

                user_profile.save()

                return redirect("/login/")
        else:
            # 数据验证不通过，返回页面和错误提示，保留数据
            return render(request, "register/register.html", {"form_obj": form_obj})
    else:
        return HttpResponse("---Method Error!---")


def login(request):
    '''登录'''
    if request.method == "GET":
        # get请求返回登录页面
        return render(request, "register/login.html")

    elif request.method == "POST":
        # post请求提交注册数据
        data = request.POST
        form_obj = formAuth.LoginForm(data)  # 数据交给form实例化
        if form_obj.is_valid():  # 验证提交数据的合法性
            valid_data = form_obj.cleaned_data
            username = valid_data.get("username")
            password = valid_data.get('password')
            authcode = valid_data.get('authcode')

            # 验证码不正确
            if request.session.get("authcode").upper() != authcode.upper():
                form_obj.add_error("authcode", "验证码错误")
                return render(request, "register/login.html", {"form_obj": form_obj})
            else:
                # 使用django的auth模块进行用户名密码验证
                user = auth.authenticate(username=username, password=password)
                if user:
                    # 登录状态
                    request.session['is_login'] = True
        
                    # 将用户名存入session中
                    request.session["user"] = username

                    auth.login(request, user)  # 将用户信息添加到session中

                    return redirect("/") # 回到主页
                else:
                    form_obj.add_error("username", "您输入的用户名或密码有误！")
                    return render(request, "register/login.html", {"form_obj": form_obj})
        else:
            # 数据验证不通过，返回页面和错误提示，保留数据
            return render(request, "register/login.html", {"form_obj": form_obj})
        
    else:
        return HttpResponse("---Method Error!---")

def logout(request):
    request.session.flush() # 删除一条记录包括(session_key session_data expire_date)三个字段
    return redirect("/") # 回到主页

def get_authcode_img(request):
    """
    获取随机验证码，带干扰噪点
    :param request: request请求，用于将验证码存放在session中
    :return: 返回验证码图片的数据内容
    """
    def get_background_color():  # 定义一个获取图片背景/噪点颜色的函数，产生浅色
        color = tuple((random.choices(range(160,256),k=3)))
        return color

    def get_content_color():  # 定义一个获取文字颜色的函数，产生深色
        color = tuple((random.choices(range(0,100),k=3)))
        return color

    img_obj = Image.new("RGB",(117,34),get_background_color())  # 创建一个图片对象
    draw_obj = ImageDraw.Draw(img_obj)  # 通过图片对象生成一个画笔对象
    font_path = os.path.join(settings.BASE_DIR,"static","plugin","webfonts","cambriai.ttf")  # 获取字体，注意有些字体无法显示数字
    # F:\Django_Blog-master\Django_Blog\static\plugin\webfonts
    font_obj = ImageFont.truetype(font_path,32)  # 创建一个字体对象
    random_code = ''  # 用户验证的字符串
    all_char = string.ascii_letters+string.digits
    for i in range(4):
        a = random.choice(all_char)
        random_code += a

    draw_obj.text((22,-3),random_code,fill=get_content_color(),font=font_obj)

    width = 117
    height = 34

    # 添加噪线
    for i in range(5):  # 添加5条干扰线
        # 两个坐标点确定一条线
        x1 = random.randint(0,width)
        y1 = random.randint(0,height)
        x2 = random.randint(0,width)
        y2 = random.randint(0,height)
        draw_obj.line((x1,y1,x2,y2),fill=get_background_color())  # 画噪线

    # 添加噪点
    for i in range(30):
        draw_obj.point((random.randint(0,width),random.randint(0,height)),fill=get_background_color())


    f = BytesIO()  # 生成内存操作符-句柄
    img_obj.save(f,"png")  # 将图片存在内存中
    data = f.getvalue()
    # 获取句柄中的内容

    # # 存验证码方式：1.存在全局变量（不可取，多个用户会顶替）2.存在各自客户的session中
    # # 方式1
    # global valid_str
    # valid_str = random_code

    # 方式二，推荐
    request.session["authcode"] = random_code
    return data

from django.contrib import auth
from django.http import JsonResponse
from django.shortcuts import (
    render, redirect, reverse, HttpResponse
)

            
            
# 验证码视图类
def GetAuthImg(request):
    """
    获取验证码视图类
    它调用上面的get_authcode_img函数
    """

    if request.method == "GET":
        data = get_authcode_img(request)
        # print("验证码：",request.session.get("authcode"))
        return HttpResponse(data)

def loginsuccess(request):
    return HttpResponse("--登录成功！--")